from nonebot import on_keyword, on_notice  # 消息关键词事件 通知事件
from nonebot.adapters.onebot.v11 import Message, GroupMessageEvent, PokeNotifyEvent, MessageSegment  # 发送字符串消息 群聊消息事件 戳一戳事件
from nonebot.permission import SUPERUSER
from nonebot.rule import to_me

ImagePath = 'file:///E:/Program_software/go-cqhttp/go-cqhttp_windows_amd64/data/images/'
imageSX = ImagePath + '34.jpg'
imageQF = ImagePath + '31.jpg'
imageKX = ImagePath + '22.jpg'
"""
on_keyword
    keywords 传入一个字符串的集合，接收到的消息包含此集合中的任意一个关键字，触发事件响应器
    permission 此参数表示能触发此事件响应器的消息发送者类型 ，常见的指定有SUPERUSER(.env文件中指定的超级用户) GROUP_ADMIN(群管理员)和GROUP_OWNER(群主)
    priority 优先级 数值越小，优先级越高，越早被执行
    block 通常和第三个参数搭配使用 用来阻断消息传递设置为True 就会阻断
"""
# word1 = on_keyword({"你是谁"})  # 注册一个名为word的事件响应器
# word2 = on_keyword({"欠菀蓉"}, permission=SUPERUSER)

# 前面两个在群里是直接对任何用户发的消息进行检索，但是这样会有时候误判，需要对方@自己，自己在回复即可
# if -> 事件响应器的rule参数 rule规则，指向的就是对应的规则函数
# 规则函数可以自己写，也可以调用nonebot内置的，@就是to_me 要使用模块rule中的to_me 或者对应 .v11对应MessageEvent的to_me模块

# 法1 调用nonebot内置模块
word1 = on_keyword({"你是谁", "你是", "你谁呀"}, rule=to_me())  # 需要@
word3 = on_keyword({"你叫什么"}, rule=to_me())
word4 = on_keyword({"晚安"}, rule=to_me())
word5 = on_keyword({"早上好", "早呀", "早"}, rule=to_me())
word6 = on_keyword({"傻逼", "猪", "儿子", "笨蛋"}, priority=10, block=True, rule=to_me())
word7 = on_keyword({"傻逼", "猪", "儿子", "笨蛋"}, priority=20, block=True)
word2 = on_keyword({"欠菀蓉"}, permission=SUPERUSER, rule=to_me())  # 必须要@ 和超级管理员才能注册事件响应器
word8 = on_keyword({"叫"}, rule=to_me())
# word9 = on_keyword({"[CQ:face,id=277]"})


# # 法2 自己编写事件响应函数  但是这样只能处理群聊消息
# def _checker(event: GroupMessageEvent) -> bool:
#     return event.to_me


# word1 = on_keyword({"你是谁"}, rule=_checker)  # 注册一个名为word的事件响应器
# word2 = on_keyword({"欠菀蓉"}, permission=SUPERUSER, rule=_checker)

# 现在我们想要知道是谁@了我，事件响应器的参数传递：事件响应器传入的参数一般如下三种：bot-机器人 event-事件 args-参数
# Bot类 -- 保存机器人相关的属性和方法：
"""
    属性:
        self_id 机器人自己的qq号
        adapter 协议适配器
    方法：
"""
# event事件参数 很多模块，上面包括的就是群聊消息
"""
    user_id -- 指定用户的qq号
"""


@word1.handle()  # 函数的装饰器 用来说明下面函数是来处理对应的事件响应器的 @响应器名.handle()
async def _(event: GroupMessageEvent):
    """
        async def 定义一个异步(协成)函数
        Nonebot的事件响应器处理的主函数一般情况下都是异步函数
        _()没有任何参数和名字的函数 主函数一般不需要名
        这里只是消息触发回复函数，不需要传参
    """
    await word1.finish(Message(f"[CQ:at,qq={event.user_id}] 我是世界第一可爱的柒海![CQ:face,id={183}]"))  # [CQ:...] CQ码可以进行转义，这里转义为qq表情
    # 结束事件响应器word，同时发送一个消息 await让异步进程进入等待状态，事件响应器中对响应器进行操作的方法一般都要加上await才能使用
    # finish用于结束此word事件响应器 和break类似 参数可传空，字符串，消息(Message)/格式化消息模板 均会发送出去 但是消息内包含CQ码，只能使用Message来包含
    # 除了CQ码，MessgeSegment类可以实现相似的功能


@word2.handle()
async def _():
    await word2.finish(Message("她是世界上最好最好的φ(>ω<*) "))


@word3.handle()
async def _():
    await word3.finish(Message("[CQ:tts,text=我是你的小可爱哦 ]"))


@word4.handle()
async def _():
    await word4.finish(Message("今天也是充满活力的一天呢φ(>ω<*)~ "))


@word5.handle()
async def _():
    await word5.finish(Message("早上好，亲爱的，今天也要美满的开始哦~") + MessageSegment.image(imageKX))


@word6.handle()
async def _():
    await word6.finish(Message("伦家做错了什么....┭┮﹏┭┮") + MessageSegment.image(imageSX))


@word7.handle()
async def _():
    await word7.finish(Message("不可以骂人哦~(；′⌒`)") + MessageSegment.image(imageQF))


@word8.handle()
async def _(event: GroupMessageEvent):
    await word8.finish(str(event.get_message())[1:])


# @word9.handle()
# async def _():
#     await word9.finish(Message("是狗修，可以拿来吃的.....诶,不能嘛o(╥﹏╥)o"))


def _check(event: PokeNotifyEvent):
    return event.target_id == event.self_id  # 被戳人qq号是自己的话


# 戳一戳实现
poke = on_notice(rule=_check)


@poke.handle()
async def _(event: PokeNotifyEvent):
    if event.user_id == 2201934266:
        await poke.finish(Message(f"[CQ:at,qq={event.user_id}]美女,有事吗[CQ:face,id={179}]"))
    else:
        await poke.finish(Message(f"[CQ:at,qq={event.user_id}]喂，别戳了[CQ:face,id={215}]"))
